require(__dirname+'/test-helper');
var Connection = require(__dirname + '/../../../lib/connection');
test('connection can take existing stream', function() {
  var stream = new MemoryStream();
  var con = new Connection({stream: stream});
  assert.equal(con.stream, stream);
});

test('using closed stream', function() {
  var makeStream = function() {
    var stream = new MemoryStream();
    stream.readyState = 'closed';
    stream.connect = function(port, host) {
      this.connectCalled = true;
      this.port = port;
      this.host = host;
    }
    return stream;
  };

  var stream = makeStream();

  var con = new Connection({stream: stream});

  con.connect(1234, 'bang');
  
  test('makes stream connect', function() {
    assert.equal(stream.connectCalled, true);
  });

  test('uses configured port', function() {
    assert.equal(stream.port, 1234);
  });

  test('uses configured host', function() {
    assert.equal(stream.host, 'bang');
  });

  test('after stream connects client emits connected event', function() {

    var hit = false;

    con.once('connect', function() {
      hit = true;
    });

    assert.ok(stream.emit('connect'));
    assert.ok(hit);

  });

  test('after stream emits connected event init TCP-keepalive', function() {

    var stream = makeStream();
    var con = new Connection({ stream: stream, keepAlive: true });
    con.connect(123, 'test');

    var res = false;

    stream.setKeepAlive = function(bit) {
      res = bit;
    };

    assert.ok(stream.emit('connect'));
    setTimeout(function() {
      assert.equal(res, true);
    })
  });
});

test('using opened stream', function() {
  var stream = new MemoryStream();
  stream.readyState = 'open';
  stream.connect = function() {
    assert.ok(false, "Should not call open");
  };
  var con = new Connection({stream: stream});
  test('does not call open', function() {
    var hit = false;
    con.once('connect', function() {
      hit = true;
    });
    con.connect();
    assert.ok(hit);
  });

});
